<?php
/**
 * @brief Klasa mapująca dane z bazy danych na obiekty klasy encyjnej  Application_Model_NodeAffiliation.
 *
 * Obiekty tej klasy pośredniczą wymianie danych między bazą danych a obiektami klasy  Application_Model_NodeAffiliation.
 * Za pomocą metod z przypisanej klasy tabeli tworzą obiekty na podstawie danych z bazy danych 
 * oraz zapisują informacje z obiektów do bazy danych.
 */
class Application_Model_NodeAffiliationMapper
{
    
    protected $_dbTable; /*!<  Obiekt klasy tabeli */

    /**
     * @brief Metoda do ustawiania nazwy powiązanej klasy tabel o podanej nazwie.
     * 
     * @param string $dbTable
     * @return Application_Model_NodeAffiliationMapper 
     */
    public function setDbTable($dbTable) {

        if (is_string($dbTable)) {

            $dbTable = new $dbTable();
        }

        if (!$dbTable instanceof Zend_Db_Table_Abstract) {

            throw new Exception('Invalid table data gateway provided');
        }

        $this->_dbTable = $dbTable;

        return $this;
    }

    /**
     * @brief Metoda zwracająca obiekt powiązanej klasy tabel.
     * 
     * @return Application_Model_DbTable_NodeRelatedToEntity 
     */
    public function getDbTable() {

        if (null === $this->_dbTable) {

            $this->setDbTable('Application_Model_DbTable_NodeRelatedToEntity');
        }

        return $this->_dbTable;
    }

    /**
     * @brief Metoda zapisująca informacje o przynależności lokalizacji do użytkowników.
     *
     * Metoda służy tylko do tworzenia w bazie danych nowych rekordów.
     *  
     * @param Application_Model_NodeAffiliation $affiliation 
     */
    public function save(Application_Model_NodeAffiliation $affiliation) { 

        $data = array(
            'Marketentity_id' => $affiliation->getMarketEntity(),
            'NetworkNode_id'  => $affiliation->getNetworkNode_id(),
            
        );
        
        $this->getDbTable()->insert($data);

    }

    /**
     * @brief Metoda wyszukująca przynależność różnych lokacji do użytkowników na podstawie danych wejściowych.
     *
     * Metoda zwraca tablicę obiektów Application_Model_NodeAffiliation
     * Zbiór rekordów uzyskanych z klasy tabel jest przetwarzany przez inną metodę.
     * 
     * @param string $query
     * @return array Application_Model_NodeAffiliation 
     */
    public function fetchAll($query = NULL) {
        if ($query === NULL) {
            $resultSet = $this->getDbTable()->fetchAll();
            
        } else {
            $table = $this->getDbTable();
            $select = $table->select();
            $select->from($table)
                    ->where($query);

            $resultSet = $this->getDbTable()->fetchAll($select);
        }
        return $this->processResultSet($resultSet);
    }
    
    /**
     * @brief Metoda przetwarza rekordy na obiekty.
     * 
     * @param Zend_Db_Table_Rowset $resultSet
     * @return array Application_Model_NodeAffiliation
     */
    private function processResultSet($resultSet) {
        $entries = array();
        foreach ($resultSet as $row) {

            $affiliation = new Application_Model_NodeAffiliation(); 

            $affiliation->setMarketEntity($row->MarketEntity_id);
            $affiliation->setNetworkNode_id($row->NetworkNode_id);

            $entries[] = $affiliation;
        }
        return $entries;
    }
   
    /**
     * @brief Metoda sprawdzająca, czy lokalizacja jest już powiązana z użytkownikiem.
     * 
     * @param string $entity
     * @param int $node
     * @return bool 
     */
    public function checkAffiliation($entity,$node)
    {
        $table = $this->getDbTable();
        $select = $table->select();
        $select->from($table,array('count(*) as amount'));       
        $select->where('MarketEntity_id = ?', $entity);
        $select->where('NetworkNode_id = ?', $node);
        $rows = $table->fetchAll($select);
        if($rows[0]->amount > 0){
            return TRUE;
        }  
        return FALSE;
    }
    
    /**
     * @brief Metoda zwracająca listę wszystkich lokalizacji powiązanych z użytkownikiem.
     * 
     * @param string $entiy
     * @return type array Application_Model_NodeAffiliation
     */
    public function fetchNodes($entiy)
    {
        $query = 'MarketEntity_id = "'.$entiy.'"';
        return $this->fetchAll($query);
    }

    /**
     * @brief Metoda usuwająca z z bazy danych rekord przyporządkowujący lokalizację do użytkownika. 
     * 
     * @param string $entity
     * @param int $node 
     */
    public function delete($entity,$node)
    {
        $this->getDbTable()->delete('MarketEntity_id = "'.$entity.'" and NetworkNode_id = '.$node);
    }
    
}

